home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / systems / atari / birkhahn-metafont-packed-disks / mf27-2_2e-disk2.zoo / inputs / pandora.lzs / PANLOW.MF < prev    next >
Text File  |  1991-06-14  |  42KB  |  1,037 lines

  1. %*****************************************************************************
  2. %        Copyright (c) 1989 by N. N. Billawala
  3. %*****************************************************************************
  4.  
  5.  
  6. % lowers.mf  lowercase roman alphabet
  7.  
  8. % 26 characters
  9.  
  10.     
  11.  vardef a_halfbowl=                                    % letter a with half bowl
  12. iff OK "a":  "The letter a";   
  13.    beginchar("a",a_w*width#+b_mono#,xheight#,0);  
  14.    lft z9=(.1w,.9h)//;         
  15.    rt z11r=(w,r_arch*h)//;       multpos(11,13)(stem.lc,0); 
  16.    bot rt z13r=(w,0);         
  17.    onaline(11l,13l)(1l,1r,5,6,12l);  
  18.     y1r=y1l+max(1,minor_curve.lc)=.52h+.75minor_curve.lc;
  19.     y5=.35[major_curve.lc-ov_b.lc,y1l]; 
  20.     y6=max(arch_thickness.lc,y5-arch_tip.lc);
  21.    onaline(11r,13r)(12r);        
  22.     y12r=x_bracket_h; y12l=max(y12r,y1r);
  23.    top y10r=bot y10l+arch_thickness.lc=h+ov_t.lc;    
  24.    good_x_for(10r)(z9,z12l,min(.95,arch_reference+.1 if singlepitch:+.05 fi))a; 
  25.    good_x_for(10l)(z9,z10r,arch_inner_amt)b;
  26.    x10l:=max(x10l,x10r-arch_thickness.lc);
  27.    lft z3l=(0,.35[-ov_b.lc,y1r])//; 
  28.    rt z3r=(lft x3l+max(1,.9bowlstem.lc),max(.4[-ov_b.lc,y1r],major_curve.lc));  
  29.    y2=.75y1r;  good_x_for(2)(z3l,z1r,.4)c; 
  30.    ref1=terminalserif.r(z13,z11,z5,z12r,.5ts,base_terminal_angle)soft;
  31.    archtip:=arch_tip.lc; save arch_tip; 
  32.    arch_tip.lc=min(archtip,minor_bowl_tip.lc,y5-arch_thickness.lc);
  33.    ref2=arch.bl(z5,-ov_b.lc,z3r,z3l)lc; 
  34.    p1'=z3r{upward}...z1l{z1r-z2}--subpath(3,5)of ref2--cycle;
  35.    p1 =z1r{z2-z1r}...z3l{downward}--outer_juncture_path.br(ref2,ref1,2)--
  36.       z11r{upward} o_t bulb.tl(z9,z10l,z10r,.75cs,.5bulb_thickness,90) i_t
  37.       z12l{downward}..z1r & cycle;
  38.    showpoints(1,2,3,5,6,9,10,11,12,13);
  39.    adjust(v_f*fitbasis.lc#+m_cc*b_mfit#,v_b*fitbasis.lc#+m_c*b_mfit#); 
  40.    show_character; endchar;
  41.  enddef;
  42.  
  43.  
  44.  def a_fullbowl=                                  % the letter a with fullbowl
  45. iff OK "a":  "The letter a";   
  46.   beginchar(97+alt0+alt2,b_w*width#+c_mono#,xheight#,0);      
  47.   top rt z11r=(w,h)//;        multpos(11,13)(stem.lc,0); 
  48.   bot rt z13r=(w,0);          pos10(max(1,.3stem.lc),0-oblique);    % spur
  49.   onaline(11l,13l)(1l,2,5,6);   
  50.    y1l=(h+ov_t.lc-minor_curve.lc)-minor_ductal.lc;
  51.    y2=y1l+minor_bowl_tip.lc;
  52.    y5=ductal[major_curve.lc-ov_b.lc,y1l]; 
  53.    y6=y5-minor_bowl_tip.lc;
  54.   onaline(11r,13r)(1r,10r,12r); 
  55.    top y10=h; y12r=x_bracket_h; y1r=y1l-.5stem.lc;
  56.   lft z3l=(0,(1-v_stress)*h-.0*bowlstem.lc)//;
  57.   rt x3r=lft x3l+bowlstem.lc;
  58.   y3r=inlimit((1-v_stress)*h+.0*bowlstem.lc)(major_curve.lc,h-minor_curve.lc);
  59.   ref1=bowl.l(z5,-ov_b.lc,z1l,h+ov_t.lc,z3r,z3l);
  60.   ref3=(z1r soften(z10r,z10l) z2);
  61.   ref4=terminalserif.r(z13,z11,z5,z12r,.5ts,base_terminal_angle)soft;
  62.   if spur:ref2=outer_bowlpath(ref1);                            % bowl and spur
  63.           p1=outer_juncture_path.br(ref2,ref4,5)--ref3--cycle; 
  64.      else:ref0=bowl.l(z5,-ov_b.lc,z1r,h+ov_t.lc,z3r,z3l);     % bowl
  65.           ref2=outer_bowlpath(ref0);  
  66.           p1=outer_juncture_path.br(ref2,ref4,5)--cycle;   fi    
  67.   p1'=bowl_counter(ref1)--cycle;                                % counter
  68.   showpoints(1,2,3,5,6,10,11,12,13);  
  69.   adjust(v_c*fitbasis.lc#+m_cc*c_mfit#,v_a*fitbasis.lc#+m_c*c_mfit#); 
  70.   show_character; endchar;
  71.  enddef;
  72.  
  73.  def letter_a= save a,b,c;
  74.   vardef a=condition(spur)t; testing_codes; a_fullbowl; enddef; 
  75.   vardef b=condition(spur)f; testing_codes;a_fullbowl; enddef;
  76.   vardef c=a_halfbowl; enddef;
  77.   if test_all_characters:a;b;c;else:if a_full_bowl:if spur:a;else:b;fi else:c;fi
  78.     fi
  79.  enddef;
  80.  
  81.  letter_a;  save letter_a,a_fullbowl,a_halfbowl;
  82.  
  83.  
  84.  
  85.  def character_points=
  86. iff OK "b":  "The letter b"; 
  87.   beginchar(98+alt2,b_w*width#+c_mono#,ascender#,0);
  88.   top lft z11l=(0,h)//;          multpos(11,14)(stem.lc,0); 
  89.   bot lft z14l=(0,0);
  90.   z15l=z14l;                     pos15(max(1,.3stem.lc),0);
  91.   onaline(11r,14r)(1r,2,5,6,12r);  
  92.    y1l=y1r=(minor_curve.lc-ov_b.lc)+minor_ductal.lc;
  93.    y2=y1r-minor_bowl_tip.lc;
  94.    y5=ductal[xheight+ov_t.lc-major_curve.lc,y1r]; 
  95.    y6=xheight+ov_t.lc;
  96.    y12r=max(y6,h-x_bracket_h);
  97.   onaline(11l,14l)(1l,12l,13l);  
  98.    y13l=x_bracket_h; 
  99.    y12l=max(h-x_bracket_h,y13l);
  100.   rt z3r=(w,v_stress*xheight+.0*bowlstem.lc)//;
  101.   lft x3l=rt x3r-bowlstem.lc;
  102.   y3l=inlimit(v_stress*xheight-.0*bowlstem.lc)
  103.              (minor_curve.lc,xheight-minor_curve.lc);
  104.  
  105.   ref1=bowl.r(z5,xheight+ov_t.lc,z1r,-ov_b.lc,z3l,z3r);
  106.   ref3=(z1l soften(z15l,z15r) z2); 
  107.   ref4=terminalserif.l(z11,z14,z12l,z12r,.5ts,asc_terminal_angle);
  108.   p1'=bowl_counter(ref1)--cycle;                                    % counter  
  109.   if spur:p1=outer_bowlpath(ref1)--ref4--ref3--cycle;            % bowl and spur
  110.      else:ref0=bowl.r(z5,xheight+ov_t.lc,z1l,-ov_b.lc,z3l,z3r);     % bowl
  111.           p1 =outer_bowlpath(ref0)--ref4--cycle;     fi
  112.   showpoints(1,2,3,5,6,11,12,13,14,15,20,21);
  113.   adjust(v_a*fitbasis.lc#+m_c*c_mfit#,v_c*fitbasis.lc#+m_cc*c_mfit#); 
  114.   show_character; endchar;
  115.  enddef;
  116.  
  117.  vardef letter_b= save a,b;
  118.   vardef a=condition(spur)t; testing_codes;character_points; enddef;  % spur
  119.   vardef b=condition(spur)f; testing_codes;character_points; enddef;  % no spur
  120.   if test_all_characters:a;b; else:if spur:a; else:b; fi fi
  121.  enddef;
  122.  
  123.  letter_b;  save letter_b;
  124.  
  125.  
  126.  
  127. iff OK "c":  "The letter c"; 
  128.   beginchar("c",c_w*width#+b_mono#,xheight#,0);
  129.  
  130.   save_num(term_length)=if bulb_taper:c_and_s.lc else:.75cs fi;
  131.   min_limit(join_radius)(.5minor_curve.lc); 
  132.   rt z1=(.95w,.9h)//;
  133.   lft z3l=(0,.5h)//;
  134.   rt z3r=(lft x3l+bowlstem.lc,.5h);
  135.   rt z5l=(w,major_curve.lc-ov_t.lc+.02h)//;          
  136.   top y2l=bot y2r+minor_curve.lc=h+ov_t.lc; 
  137.   bot y4l=top y4r-major_curve.lc=-ov_t.lc; 
  138.   good_x_for(2l)(z3l,z1,.6)a;  good_x_for(2r)(z3r,z1-(bulb_thickness,0),.6)b; 
  139.   good_x_for(4l)(z3l,z5l,.5)c; 
  140.   ref1=z4l{right}...z5l;
  141.   pos5(max(1,.7major_curve.lc),angle(direction 1 of ref1)+90);
  142.   good_x_for(4r)(z3r,z5r,.5)d; 
  143.  
  144.   x4r:=min(x4r,x4l+minor_curve.lc);
  145.  
  146.   p1=(bulb.tr(z1,z2r,z2l,term_length,bulb_thickness,90) o_t
  147.       z3l{downward} o_t z4l{right} o_t z5l 
  148.         if softpath:)softjoin(z5l--z5r)softjoin(else:--fi 
  149.       z5r i_t z4r{left} i_t z3r{upward} i_t z2r{right})--cycle;
  150.  
  151.   showpoints(1,2,3,4,5);
  152. adjust(v_c*fitbasis.lc#+m_e*b_mfit#,v_h*fitbasis.lc#+m_ee*b_mfit#); 
  153. show_character; endchar;
  154.  
  155.  
  156.  
  157. iff OK "d":  "The letter d"; 
  158.   beginchar("d",b_w*width#+c_mono#,ascender#,0);
  159.  
  160.   top rt z11r=(w,h)//;           multpos(11,14)(stem.lc,0); 
  161.   bot rt z14r=(w,0);
  162.   z15r=(1.05w,0);                pos15(max(1,.8stem.lc),0);
  163.   onaline(11l,14l)(1l,2,5,6,12l);
  164.    y1l=(xheight+ov_t.lc-minor_curve.lc)-minor_ductal.lc;
  165.    y2=y1l+minor_bowl_tip.lc;
  166.    y5=ductal[major_curve.lc-ov_b.lc,y1l]; 
  167.    y6=y5-minor_bowl_tip.lc;
  168.   onaline(11r,14r)(12r,13r);     
  169.    y13r=x_bracket_h; 
  170.    y12r=max(h-x_bracket_h,y13r);  y12l=max(y12r,y1l); 
  171.   lft z3l=(0,(1-v_stress)*xheight-.0*bowlstem.lc)//;
  172.   rt x3r=lft x3l+bowlstem.lc;
  173.   y3r=inlimit((1-v_stress)*xheight+.0*bowlstem.lc)
  174.               (major_curve.lc,xheight-minor_curve.lc);
  175.  
  176.   ref1=bowl.l(z5,-ov_b.lc,z1l,xheight+ov_t.lc,z3r,z3l);
  177.   ref2=outer_bowlpath(ref1);
  178.   ref3=terminalserif.r(z14,z11,z5,z13r,.5ts,base_terminal_angle)soft;
  179.  
  180.   p1'=bowl_counter(ref1)--cycle;                                 % counter
  181.   p1 =terminalserif.l(z11,z14,z12l,z12r,.5ts,asc_terminal_angle) % stem
  182.       --outer_juncture_path.br(ref2,ref3,5)--cycle;              % bowl
  183.  
  184.   showpoints(1,2,3,5,6,11,12,13,14,15);  
  185. adjust(v_c*fitbasis.lc#+m_cc*c_mfit#,v_a*fitbasis.lc#+m_c*c_mfit#); 
  186. show_character; endchar;
  187.  
  188.  
  189. iff OK "e":  "The letter e"; 
  190.   beginchar("e",b_w*width#+d_mono#,xheight#,0);
  191.  
  192.   min_limit(join_radius)(.5minor_curve.lc); 
  193.   bot rt z1r=(.95w,round(.6h-.65*.8thin_stem.lc))//; 
  194.   pos1(if narrow_condition:w_narrow_amt[thin_stem.lc,stem.lc] 
  195.         else:max(1,.85stem.lc) fi,ebar_angle);
  196.   lft z3l=(0,(1-v_stress)*h)//;
  197.   rt z3r=(lft x3l+bowlstem.lc,y3l);
  198.   rt z5l=(w,.15h)//;             pos5(minor_curve.lc,130-oblique); 
  199.   top y2l=bot y2r+major_curve.lc=h+ov_t.lc;    
  200.   bot y4l=top y4r-minor_curve.lc=-ov_t.lc;   
  201.   good_x_for(2l)(z3l,z1r,.51)a;   good_x_for(2r)(z3r,z1l,.49)b; 
  202.   good_x_for(4l)(z3l,z5l,.5)c;   good_x_for(4r)(z3r,z5r,.5)d;
  203.   x4r:=min(x4r,x4l+minor_curve.lc); 
  204.   onaline(1l,1r)(40); x40=x41=0;
  205.   z42=z1r+(max(1,.8thin_stem.lc),0)rotated(90+ebar_angle);  
  206.   z42-z41=whatever*(z1r-z1l);
  207.  
  208.   ref1=z2r{right} ..tension atleast .8 ..z1l{downward}; % inner right ref path
  209.   ref2=z5r i_t z4r{left} i_t z3r{upward} i_t z2r{right}; % inner left ref path
  210.   ref3=z1r--z40;                                         % outer bar ref path
  211.   ref4=z41--z42;                                         % inner bar ref path
  212.   z20=ref2 intersectionpoint ref3;  (t1,t2)=ref2 intersectiontimes ref3;
  213.   z21=ref2 intersectionpoint ref4;  (t3,t4)=ref2 intersectiontimes ref4;
  214.   z22=ref1 intersectionpoint ref4;  (t5,t6)=ref1 intersectiontimes ref4;
  215.  
  216.   p1 =(z2l{left} o_t_c z3l{downward} o_t_c z4l{right} o_t_c z5l
  217.         if softpath:)softjoin(z5l--z5r)softjoin( else:-- fi
  218.       subpath(0,t1)of ref2--z20 if softpath:)softjoin(z20 fi
  219.       --z1r)softjoin(z1r{upward}..tension atleast .8 .. z2l{left})--cycle;
  220.   p1'=subpath(0,t5)of ref1--z22-(eps,0)--z21+(eps,0)--
  221.       subpath(t3,infinity)of ref2--cycle;
  222.  
  223.   showpoints(1,2,3,4,5,20,21,22,40,41,42);
  224. adjust(v_c*fitbasis.lc#+m_a*d_mfit#,v_f*fitbasis.lc#+m_a*d_mfit#); 
  225. show_character; endchar;
  226.  
  227.  
  228.  
  229. iff OK "f":  "The letter f";  
  230.   beginchar("f",r_w*width#+a_mono#,ascender#,0); 
  231.  
  232.   lft z1l=(round .2w,h)//;     multpos(1,4)(stem.lc,0);
  233.   bot lft z4l=(round .2w,0);   
  234.   save_num(knob)=min(bulb_thickness,.4(w-x4r));    
  235.   onaline(1l,4l)(2l,3l);       y2l=max(xheight,.75xheight+(r_arch*(h-xheight)));
  236.   onaline(1r,4r)(2r,3r,12r);   y2r=max(xheight,.75xheight+(l_arch*(h-xheight)));
  237.   rt z6=(w,.75[y5l,y5r])//;    y3l=y3r=x_bracket_h;
  238.   top y5r=bot y5l+minor_curve.lc=h+ov_t.lc; 
  239.   good_x_for(5r)(z3l,z6,.6)a;  good_x_for(5l)(z3r,z6-(knob,0),.6)b;
  240.  
  241.   top rt z11=(w,xheight)//;        multpos(12,13)(max(1,.8thin_stem.lc),90);
  242.   y12r=y11;  
  243.   lft z13r=(0,y11)//; 
  244.  
  245.   p1=fullserif(z4,z1,z3l,z3r,.5hs,.75hs)--z2r{upward} i_t
  246.      bulb.tr(z6,z5l,z5r,.75cs,knob,90) o_t z2l{downward}--cycle;
  247.  
  248.   min_limit(join_radius)(.5*min(.8thin_stem.lc,serif_thickness));
  249.   p2=(arm.tr(z11,z12l,z12r,.15as,.25tip_thickness,90)
  250.       soften(z13r,z13l) z12l)--cycle;
  251.  
  252.   showpoints(1,2,3,4,5,6,11,12,13);
  253. adjust(v_a*fitbasis.lc#-.25r_w*width#+m_e*a_mfit#,0*fitbasis.lc#+m_ee*a_mfit#);
  254. show_character; endchar;
  255.  
  256.  
  257.  
  258.  def g_doublebowl=
  259. iff OK "g":  "The letter g";
  260.   beginchar(103+alt2,o_w*width#+b_mono#,xheight#,descender#);
  261.  
  262.   top y1r=h+ov_t.lc;             bot y1l=top y1r-max(1,.9major_curve.lc);% bowl
  263.   bot y3r=round(.3h);            top y3l=bot y3r+max(1,.9major_curve.lc);
  264.   lft z2r=(0,(1-v_stress)[y3r,y1r])//;
  265.   rt z2l=(lft x2r+max(1,.9bowlstem.lc),(1-v_stress)[y3l,y1l]);
  266.   rt z4r=(round(.9w),v_stress[y3r,y1r])//;
  267.   lft z4l=(rt x4r-max(1,.9bowlstem.lc),v_stress[y3l,y1l]);
  268.   good_x_for(1r)(z2r,z4r,.52)a;   good_x_for(1l)(z2l,z4l,.48)b;  
  269.   good_x_for(3r)(z2r,z4r,.48)c;   good_x_for(3l)(z2l,z4l,.52)d;  
  270.  
  271.   top rt z5r=(w,round .95h)//;  pos5(max(1,thin_stem.lc),90-oblique);     % ear
  272.   ref1=z3r{right} o_t z4r{upward} o_t z1r{left};
  273.   z6l=ref1 intersectionpoint ((0,y5l)--z5l);
  274.   z6r=ref1 intersectionpoint ((0,y5r)--z5r);
  275.   (t1,t2)=ref1 intersectiontimes ((0,y5l)--z5l);
  276.   (t3,t4)=ref1 intersectiontimes ((0,y5r)--z5r);
  277.   ref2=z1r{left} o_t z2r{downward} o_t z3r{right};
  278.  
  279.   z20=(0,.1[y3r,y2r]); z21=(0,y20+max(1,.35thin_stem.lc));
  280.   z10r=ref2 intersectionpoint (z20--z20+(w,0));
  281.   z10l=ref2 intersectionpoint (z21--z21+(w,0));
  282.   z11l=(0,.45stem.lc)//; 
  283.   (z10r-z11r)=whatever*(z10l-z11l); y11r=.8stem.lc;  
  284.   z12l=(.25w,-ov_b.lc)//; z12r=(.25[x11r,w],.8stem.lc)//;
  285.   z13l=(.6w,-ov_b.lc)//; z13r=(.6[x11r,w],.8stem.lc)//;
  286.   z15r=(.5w,-d)//; z15l=(.5w,-d+thin_stem.lc)//;
  287.   z14l=(w-max(1,.75[thin_stem.lc,.8stem.lc]),.5[y15l,y13l])//;
  288.   z14r=(w,.5[y15r,y13r]);
  289.   z16r=(0,.5[y12l,y15r])//; z16l=(x16r+thin_stem.lc,.5[y12l,y15l])//;
  290.   z17r=z12l-(thin_stem.lc,0);
  291.  
  292.   p1 =subpath(0,t1)of ref1--z6l--z5l--z5r--z6r--subpath(t3,2)of ref1--
  293.       ref2--cycle;
  294.   p1'=z1l{left} i_t z2l{downward} i_t z3l{right} i_t z4l{upward} i_t cycle;
  295.   p2=z10r{z11r-z10r}..controls(z11r)..z12r{right}...z13r{right}...
  296.      z14r{downward}...z15r{left}...z16r...z17r-(0,eps)--z17r{left}...
  297.      z11l--z10l--cycle;
  298.   p2'=z12l{right}..z13l{right}...z14l{downward}...z15l{left}...
  299.       z16l{upward}...cycle;
  300.  
  301.   showpoints(1,2,3,4,5,6,10,11,12,13,14,15,16,17,20,21);
  302.   adjust(v_c*fitbasis.lc#+m_a*b_mfit#,v_g*fitbasis.lc#+m_a*b_mfit#); 
  303.   show_character; endchar;
  304.  enddef;
  305.  
  306.  def g_fullbowl=
  307. iff OK "g":  "The letter g";
  308.   beginchar(103+alt1,b_w*width#+c_mono#,xheight#,descender#);  
  309.   top rt z11r=(w,h)//;          multpos(11,14)(stem.lc,0); 
  310.   bot rt z14r=(w,-d)//;         pos10(max(1,.3stem.lc),0-oblique);     % spur
  311.   onaline(11l,14l)(1l,2,5,6,13l); 
  312.    y1l=(h+ov_t.lc-minor_curve.lc)-minor_ductal.lc;
  313.    y2=y1l+minor_bowl_tip.lc; y1r=y1l;
  314.    y5=ductal[arch_thickness.lc-ov_b.lc,y1l]; 
  315.    y6=y5-minor_bowl_tip.lc;
  316.   onaline(11r,14r)(1r,10r,13r); 
  317.    y13r=min(.25xheight,-d+(1-v_stress)*xheight);
  318.    y13l=.3[y6,y14+minor_curve.lc]; 
  319.    top y10=h;
  320.   lft z3l=(0,(1-v_stress)*h-.0*bowlstem.lc)//;
  321.   rt x3r=lft x3l+bowlstem.lc;
  322.   y3r=inlimit((1-v_stress)*h+.0*bowlstem.lc)(major_curve.lc,h-minor_curve.lc);
  323.   lft z16=(.1w,-.9d)//;    
  324.   bot y15r=top y15l-minor_curve.lc=-d-ov_b.lc;
  325.   good_x_for(15r)(z16,z13r,.4)a;
  326.   good_x_for(15l)(z16+(bulb_thickness,0),z13l,.4)b;
  327.  
  328.   ref1=bowl.l(z5,-ov_b.lc,z1l,h+ov_t.lc,z3r,z3l);
  329.   ref2=z6--z13l{downward} i_t 
  330.        bulb.bl(z16,z15l,z15r,.5cs,bulb_thickness,90) o_t z13r{upward};  % tail
  331.   ref3=(z1r soften(z10r,z10l) z2);
  332.   p1'=bowl_counter(ref1)--cycle;                                 % counter
  333.   if spur:p1=ref2--ref3--outer_bowlpath(ref1)--cycle;            % bowl and spur
  334.      else:ref0=bowl.l(z5,-ov_b.lc,z1r,h+ov_t.lc,z3r,z3l);        % bowl
  335.           p1=ref2--outer_bowlpath(ref0)--cycle;     fi
  336.   showpoints(1,2,3,5,6,10,11,13,14,15,20,21);
  337.   adjust(v_c*fitbasis.lc#+m_cc*c_mfit#,v_a*fitbasis.lc#+m_c*c_mfit#); 
  338.   show_character; endchar;   
  339.  enddef;
  340.  
  341.  def letter_g= save a,b,c;
  342.   vardef a=condition(spur)t; testing_codes;g_fullbowl; enddef; 
  343.   vardef b=condition(spur)f; testing_codes;g_fullbowl; enddef;
  344.   vardef c=condition(g_full_bowl)f; testing_codes;g_doublebowl; enddef;
  345.   if test_all_characters:a;b;c;else:if g_full_bowl:if spur:a;else:b;fi else:c;fi
  346.     fi
  347.  enddef;
  348.  
  349.  letter_g;  save letter_g,g_fullbowl,g_doublebowl;
  350.  
  351.  
  352.  
  353.  
  354. iff OK "h":  "The letter h"; 
  355.   beginchar("h",n_w*width#+b_mono#,ascender#,0);
  356.  
  357.   y5=ductal[xheight-arch_thickness.lc,serif_thickness];  
  358.  
  359.   top rt z1r=(w,h)//;           multpos(1,4,11,14)(stem.lc,0);
  360.   bot rt z4r=(w,0);
  361.   top lft z11l=(0,h)//;  
  362.   bot lft z14l=(0,0);          
  363.   onaline(11l,14l)(12l,13l);    y13l=x_bracket_h;  y12l=max(h-x_bracket_h,y13l);
  364.   onaline(11r,14r)(5,12r,13r);  y13r=min(y13l,y5); y12r=max(y12l,xheight);
  365.   onaline(1l,4l)(2l,3l);  y2l=min(l_arch*xheight,xheight-arch_thickness.lc);
  366.   onaline(1r,4r)(2r,3r);  y2r=r_arch*xheight; y3r=min(x_bracket_h,y2r);
  367.                           y3l=min(x_bracket_h,y2l);
  368.   ref1=z13r..terminalserif.l(z11,z14,z12l,z12r,.5ts,asc_terminal_angle)..z13l;
  369.   ref2=arch.tr(z5,xheight+ov_t.lc,z2l,z2r)lc;
  370.  
  371.   p1=fullserif(z14,z11,z13l,z13r,.5hs,.5hs)--softenit(ref1,ref2)--
  372.      fullserif(z4,z1,z3l,z3r,.5hs,.75hs)--softenit(ref2,ref1)--cycle;
  373.  
  374.  showpoints(1,2,3,4,5,11,12,13,14);
  375. adjust(v_a*fitbasis.lc#+m_c*b_mfit#,v_b*fitbasis.lc#+m_cc*b_mfit#); 
  376. show_character; endchar;
  377.  
  378.  
  379. iff OK "i":  "The letter i"; 
  380.   beginchar("i",i_w*width#+b_mono#,xheight#,0); 
  381.  
  382.   bot z40=(if singlepitch:.55w else:.5w fi,0);  multpos(1,4,40)(stem.lc,0);      
  383.   lft x4l=round x40l; bot y4=0;  
  384.   z1=(x4,h)//; 
  385.   onaline(1,4)(11);        y11=y1+max(1,.2h);
  386.   onaline(1l,4l)(2l,3l);   y3l=y3r=x_bracket_h;           
  387.   onaline(1r,4r)(2r,3r);   y2l=y2r=max(h-x_bracket_h,y3l);
  388.  
  389.   p1=fullserif(z4,z1,z3l,z3r,.75hs,.75hs)--
  390.      terminalserif.l(z1,z4,z2l,z2r,.5ts,x_terminal_angle)--cycle;
  391.   p2=dot.b(z11,accent_dot_diameter);
  392.  
  393.  if singlepitch:pickup pencircle yscaled thin_stem.lc rotated -oblique;
  394.     lft top z12=(0,h)//; rt top z13=(x1,h); 
  395.     draw z12--z13; showpoints(12,13);
  396.     fi  
  397.  
  398.   showpoints(1,2,3,4,11,40);
  399. adjust(v_a*fitbasis.lc#+m_a*b_mfit#,v_a*fitbasis.lc#+m_a*b_mfit#); 
  400. show_character; endchar;
  401.  
  402.  
  403. iff OK "j":  "The letter j";
  404.   beginchar("j",j_w*width#+a_mono#,xheight#,descender#);
  405.  
  406.   top rt z1r=(w,h)//;        multpos(1,4)(stem.lc,0);
  407.   rt z4r=(w,0);      
  408.   onaline(1l,4l)(2l,3l);     y3l=max(.25xheight,-d+(l_arch*(d+.25xheight)));
  409.   onaline(1r,4r)(2r,3r);     y3r=max(.25xheight,-d+(r_arch*(d+.25xheight)));
  410.   onaline(1,4)(11);          y11=y1+max(1,.2h);  y2l=y2r=h-x_bracket_h;
  411.   lft z6=(0,-.95d)//;      
  412.   save_num(knob)=min(bulb_thickness,.3*abs(x4l-x6));            
  413.   bot y5r=top y5l-minor_curve.lc=-d-ov_b.lc;
  414.   good_x_for(5r)(z6,z3r,.4)a;  good_x_for(5l)(z6+(knob,0),z3l,.4)b;
  415.  
  416.   p1=terminalserif.l(z1,z4,z2l,z2r,.5ts,x_terminal_angle)--z3l{downward} i_t
  417.      bulb.bl(z6,z5l,z5r,.5cs,knob,90) o_t z3r{upward}--cycle;
  418.   p2=dot.b(z11,accent_dot_diameter);
  419.  
  420.  if singlepitch:pickup pencircle yscaled thin_stem.lc rotated -oblique;
  421.     lft top z12=(.2w,h)//; rt top z13=(x1,h); 
  422.     draw z12--z13; showpoints(12,13);
  423.     fi  
  424.  
  425.   showpoints(1,2,3,4,5,6,11);
  426. adjust(m_ee*a_mfit#,v_a*fitbasis.lc#+m_e*a_mfit#);
  427. show_character; endchar;
  428.  
  429.  
  430.  
  431.  def k_without_beveled_join=
  432. iff OK "k":  "The letter k"; 
  433.   beginchar(107+alt5,b_w*width#+c_mono#,ascender#,0);
  434.   top lft z11l=(0,h)//;             multpos(11,14)(stem.lc,0);
  435.   bot lft z14l=(0,0);       
  436.   onaline(11r,14r)(12r,13r,3r,41);  y3r=.5xheight;
  437.   onaline(11l,14l)(12l,13l);        y13l=x_bracket_h; y13r=max(y3r,y13l);
  438.                                     y12l=max(h-x_bracket_h,y13l); 
  439.   top rt z1r=(if narrow_condition:w else:.95w fi,xheight)//;      
  440.   multpos(1,3)(max(1,.9thin_stem.lc),constant_angle(z1r,z3r,0));   
  441.   onaline(1,3)(44);                 top y44=xheight;
  442.   onaline(1l,3l)(2l,4l,41);         y12r=max(h-x_bracket_h,y41);
  443.   onaline(1r,3r)(2r,40,42);         y4l=.02[y41,y44]; % y4l places bot/right arm
  444.   z6r=(w,0);                        y2l=max(xheight-x_bracket_h,y41); 
  445.   multpos(4,6)(max(1,.95stem.lc),constant_angle(z4l,z6r,max(1,.95stem.lc))lr);
  446.   onaline(4r,6r)(5r,42);  y2r=max(xheight-x_bracket_h,y42); 
  447.   onaline(4l,6l)(5l,40);  y5l=y5r=min(x_bracket_h,y4l,y40);
  448.   onaline(4,6)(43);       bot y43=0;
  449.  
  450.   p1=(fullserif(z14,z11,z13l,z13r,.5hs,.5hs) soften(z3r,z40)
  451.       fullserif.r(z43,z4,z5l,z5r,.5hs,.5hs)--z42 
  452.         if softpath:)softjoin(z42 fi--
  453.       fullserif.r(z44,z3,z2l,z2r,.5hs,.25hs)--z41 
  454.         if softpath:)softjoin(z41 fi--
  455.       terminalserif.l(z11,z14,z12l,z12r,.5ts,asc_terminal_angle))--cycle; 
  456.  
  457.   showpoints(1,2,3,4,5,6,11,12,13,14,40,41,42,43,44);
  458.   adjust(v_a*fitbasis.lc#+m_c*c_mfit#,v_g*fitbasis.lc#+m_cc*c_mfit#); 
  459.   show_character; endchar;
  460.  enddef;
  461.  
  462.  def k_with_beveled_join=  
  463. iff OK "k":  "The letter k"; 
  464.   beginchar(107+alt5,b_w*width#+b_mono#,ascender#,0);
  465.   top lft z11l=(0,h)//;       multpos(11,14)(stem.lc,0);
  466.   bot lft z14l=(0,0);        
  467.   onaline(11l,14l)(12l,13l);  y13l=y13r=x_bracket_h; 
  468.   onaline(11r,14r)(12r,13r);  y12l=y12r=max(h-x_bracket_h,y13l);
  469.   ref1=rightserif(z14,z11,z13l,z13r,.5hs)--rightserif(z11,z14,z12l,z12r,.5hs);
  470.   top rt z1r=(if narrow_condition:w else:.95w fi,xheight)//;            
  471.   z3l=z4l=ref1 intersectionpoint ((0,.55xheight)--(w,.55xheight));
  472.   z6r=(w,0);
  473.  
  474.   multpos(4,6)(max(1,.95stem.lc),constant_angle(z4l,z6r,max(1,.95stem.lc))lr);
  475.   multpos(1,3)(max(1,.9thin_stem.lc),constant_angle(z1r,z4l,thin_stem.lc));     
  476.  
  477.   onaline(1l,3l)(2l);   
  478.   onaline(1r,3r)(2r,42);  
  479.   onaline(1,3)(44);       top y44=xheight; 
  480.   onaline(4r,6r)(5r,42);  y2l=y2r=max(xheight-x_bracket_h,y4l,y42); 
  481.   onaline(4l,6l)(5l);     y5l=y5r=min(x_bracket_h,y4l,y42);
  482.   onaline(4,6)(43);       bot y43=0;
  483.  
  484.   p1=fullserif(z14,z11,z13l,z13r,.5hs,.5hs)--
  485.      terminalserif.l(z11,z14,z12l,z12r,.5ts,asc_terminal_angle)--cycle; 
  486.   p2=(terminalserif.r(z43,z4,z5l,z5r,.5ts,base_terminal_angle)--z42 
  487.        if softpath:)softjoin(z42 fi--
  488.      fullserif.r(z44,z3,z2l,z2r,.5hs,.25hs)--z4l)--cycle;
  489.  
  490.   showpoints(1,2,3,4,5,6,11,12,13,14,42,43,44);
  491.   adjust(v_a*fitbasis.lc#+m_c*b_mfit#,v_g*fitbasis.lc#+m_cc*b_mfit#); 
  492.   show_character; endchar;
  493.  enddef;
  494.  
  495.  vardef letter_k= save a,b;
  496.   vardef a=condition(beveled_join)t;testing_codes;k_with_beveled_join;   enddef;
  497.   vardef b=condition(beveled_join)f;testing_codes;k_without_beveled_join;enddef;
  498.   if test_all_characters:a;b; else:if beveled_join:a; else:b; fi fi
  499.  enddef;
  500.  
  501.  letter_k; save letter_k,k_with_beveled_join,k_without_beveled_join;
  502.  
  503.  
  504.  
  505.  
  506. iff OK "l":  "The letter l";  
  507.   beginchar("l",i_w*width#+b_mono#,ascender#,0); 
  508.  
  509.   bot z40=(if singlepitch:.55w else:.5w fi,0);
  510.   multpos(1,4,40)(stem.lc,0);      
  511.   lft x4l=round x40l; bot y4=0;  
  512.   z1=(x4,h)//; 
  513.   onaline(1l,4l)(2l,3l);  y3l=y3r=x_bracket_h;           
  514.   onaline(1r,4r)(2r,3r);  y2l=y2r=max(h-x_bracket_h,y3l); 
  515.  
  516.   p1=fullserif(z4,z1,z3l,z3r,.75hs,.75hs)--
  517.      terminalserif.l(z1,z4,z2l,z2r,.5ts,asc_terminal_angle)--cycle;
  518.  
  519.  if singlepitch:pickup pencircle yscaled thin_stem.lc rotated -oblique;
  520.     lft top z11=(0,h)//; rt top z12=(x1,h); 
  521.     draw z11--z12; showpoints(11,12);
  522.     fi  
  523.   showpoints(1,2,3,4);
  524. adjust(v_a*fitbasis.lc#+m_a*b_mfit#,v_a*fitbasis.lc#+m_a*b_mfit#); 
  525. show_character; endchar;
  526.  
  527.  
  528. iff OK "m":  "The letter m"; 
  529.   beginchar("m",m_w*width#+f_mono#,xheight#,0);
  530.  
  531.   bot lft z4l=(0,0);   multpos(1,4,11,14,21,24,44,44')(stem.lc,0);
  532.                                   % rounds stems/spaces between stems to be =
  533.   y44=y44'=y14=y24=y4;            % y-values of refs set to actual pts
  534.   x44l-x4l=x44'l-x44l;            % makes spaces equal & connects ref to
  535.   x44'r=w;                        %   actual pts
  536.   x14l=round x44l;                % makes actual pt a rounded ref pt
  537.   x24l-x14l=x14l-x4l; w:=x24r;    % makes actual spaces equal;resets x24r
  538.  
  539.   top z1=(x4,h)//; top z11=(x14,h)//; top z21=(x24,h)//; 
  540.   y5=y15=ductal[h-arch_thickness.lc,serif_thickness];  
  541.   onaline(1l,4l)(2l,3l);         y3l=x_bracket_h; y2l=max(h-x_bracket_h,y3l);
  542.   onaline(1r,4r)(5,3r);          y3r=min(y3l,y5);
  543.   onaline(11l,14l)(12l,13l);     y22r=r_arch*h;
  544.   onaline(11r,14r)(15,13r);      y12l=y22l=min(l_arch*h,h-arch_thickness.lc);
  545.   onaline(21l,24l)(22l,23l);     y13l=y23l=min(y3l,y12l);
  546.   onaline(21r,24r)(22r,23r);     y13r=y23r=min(y3r,y3l);
  547.                
  548.   ref1=terminalserif.l(z1,z4,z2l,z3r,.5ts,x_terminal_angle);
  549.   ref2=z13r--arch.tr(z5,h+ov_t.lc,z12l,z15)lc;
  550.   ref5=outer_juncture_path.tl(ref2,ref1,3);
  551.   ref3=arch.tr(z15,h+ov_t.lc,z22l,z22r)lc;
  552.   z40=(point 2 of ref3);z41=z40+(h,0)rotated angle(z40-precontrol 2 of ref3);
  553.   ref4=subpath(0,2)of ref3--z41;
  554.   (t1,t2)=ref4 intersectiontimes ref5;
  555.  
  556.   p1=fullserif(z24,z21,z23l,z23r,.5hs,.75hs)--
  557.      subpath(0,t1)of ref4--subpath(t2,infinity)of ref5--
  558.      softenit(fullserif(z4,z1,z3l,z3r,.5hs,.5hs)--z5,
  559.               z5--subpath(3,infinity)of ref2)--
  560.      softenit(fullserif(z14,z11,z13l,z13r,.5hs,.5hs)--z15,
  561.               subpath(3,5)of ref3)--cycle;
  562.   
  563.   showpoints(1,2,3,4,5,11,12,13,14,15,21,22,23,24,41,44,44');
  564. adjust(v_a*fitbasis.lc#+m_c*f_mfit#,v_b*fitbasis.lc#+m_cc*f_mfit#); 
  565. show_character; endchar;
  566.  
  567.  
  568.  
  569. iff OK "n":  "The letter n"; 
  570.   beginchar("n",n_w*width#+b_mono#,xheight#,0);
  571.  
  572.   y5=ductal[h-arch_thickness.lc,serif_thickness];  
  573.  
  574.   top rt z1r=(w,h)//;        multpos(1,4,11,14)(stem.lc,0);
  575.   bot rt z4r=(w,0);
  576.   top lft z11l=(0,h)//;    
  577.   bot lft z14l=(0,0);        
  578.   onaline(11l,14l)(12l,13l); y13l=x_bracket_h; y12l=max(h-x_bracket_h,y13l);
  579.   onaline(11r,14r)(5,13r);   y13r=min(y13l,y5); 
  580.   onaline(1l,4l)(2l,3l);     y2l=min(l_arch*h,h-arch_thickness.lc);y2r=r_arch*h;
  581.   onaline(1r,4r)(2r,3r);     y3l=min(x_bracket_h,y2l);y3r=min(x_bracket_h,y2r);
  582.  
  583.   ref1=z13r..terminalserif.l(z11,z14,z12l,z13r,.5ts,x_terminal_angle);
  584.   ref2=arch.tr(z5,h+ov_t.lc,z2l,z2r)lc;
  585.  
  586.   p1=fullserif(z14,z11,z13l,z13r,.5hs,.5hs)--
  587.      softenit(ref1,subpath(3,5)of ref2)--
  588.      fullserif(z4,z1,z3l,z3r,.5hs,.75hs)--
  589.      outer_juncture_path.tl(ref2,ref1,2)--cycle;
  590.  
  591.   showpoints(1,2,3,4,5,11,12,13,14);
  592. adjust(v_a*fitbasis.lc#+m_c*b_mfit#,v_b*fitbasis.lc#+m_cc*b_mfit#); 
  593. show_character; endchar;
  594.  
  595.  
  596. iff OK "o":  "The letter o"; 
  597.   beginchar("o",oo_w*width#+d_mono#,xheight#,0);
  598.  
  599.   top z1=(h_stress*w,h+ov_t.lc)//;
  600.   lft z2=(0,(1-v_stress)*h)//;
  601.   bot z3=((1-h_stress)*w,-ov_b.lc)//;
  602.   rt z4=(w,v_stress*h)//;
  603.  
  604.   circular_shape(y1,y3,x2,x4,minor_curve.lc,bowlstem.lc); 
  605.  
  606.  showpoints(1,2,3,4);
  607. adjust(v_c*fitbasis.lc#+m_a*d_mfit#,v_c*fitbasis.lc#+m_a*d_mfit#); 
  608. show_character; endchar;
  609.  
  610. % Only y1/y3 and x2/x4 values actually used; the points are put in for proofs
  611.  
  612.  
  613. iff OK "p":  "The letter p"; 
  614.   beginchar("p",b_w*width#+c_mono#,xheight#,descender#);
  615.     
  616.   top lft z11l=(0,h)//;          multpos(11,14)(stem.lc,0); 
  617.   bot lft z14l=(0,-d)//;      
  618.   onaline(11r,14r)(1,2,5,13r);  
  619.    y1=(minor_curve.lc-ov_b.lc)+minor_ductal.lc;
  620.    y2=y1-minor_bowl_tip.lc;
  621.    y5=ductal[h+ov_t.lc-major_curve.lc,y1]; 
  622.   onaline(11l,14l)(12l,13l);  
  623.    y13l=-d+x_bracket_h; y13r=min(y13l,y2);
  624.    y12l=max(h-x_bracket_h,y13l);
  625.   rt z3r=(w,v_stress*xheight+.0*bowlstem.lc)//;
  626.   lft x3l=rt x3r-bowlstem.lc;
  627.   y3l=inlimit(v_stress*xheight-.0*bowlstem.lc)
  628.              (minor_curve.lc,xheight-minor_curve.lc);
  629.  
  630.   ref1=bowl.r(z5,h+ov_t.lc,z1,-ov_b.lc,z3l,z3r);
  631.   ref2=outer_bowlpath(ref1);
  632.   ref3=terminalserif.l(z11,z14,z12l,z5,.5ts,x_terminal_angle);
  633.  
  634.   p1'=bowl_counter(ref1)--cycle;                                 % counter  
  635.   p1 =outer_juncture_path.tl(ref2,ref3,5)--
  636.       fullserif(z14,z11,z13l,z13r,.5hs,1hs)--cycle;              % bowl
  637.  
  638.   showpoints(1,2,3,5,11,12,13,14);
  639. adjust(v_a*fitbasis.lc#+m_c*c_mfit#,v_c*fitbasis.lc#+m_cc*c_mfit#); 
  640. show_character; endchar;
  641.  
  642.  
  643.  
  644.  def character_points=
  645. iff OK "q":  "The letter q with foot"; 
  646.   beginchar(113+alt2,b_w*width#+c_mono#,xheight#,descender#);  
  647.   top rt z11r=(w,h)//;          multpos(11,14)(stem.lc,0); 
  648.   bot rt z14r=(w,-d)//;         pos10(max(1,.3stem.lc),0-oblique);     % spur
  649.   onaline(11l,14l)(1l,2,5,6,13l); 
  650.    y1l=(h+ov_t.lc-minor_curve.lc)-minor_ductal.lc;
  651.    y2=y1l+minor_bowl_tip.lc; y1r=y1l;
  652.    y5=ductal[arch_thickness.lc-ov_b.lc,y1l]; 
  653.    y6=y5-minor_bowl_tip.lc;
  654.   onaline(11r,14r)(1r,10r,13r); 
  655.    y13r=-d+x_bracket_h; y13l=min(y6,y13r);
  656.    top y10=h;
  657.   lft z3l=(0,(1-v_stress)*h-.0*bowlstem.lc)//;
  658.   rt x3r=lft x3l+bowlstem.lc;
  659.   y3r=inlimit((1-v_stress)*h+.0*bowlstem.lc)(major_curve.lc,h-minor_curve.lc);
  660.  
  661.   ref1=bowl.l(z5,-ov_b.lc,z1l,h+ov_t.lc,z3r,z3l);
  662.   ref2=z6--fullserif(z14,z11,z13l,z13r,.5hs,1hs);                % tail
  663.   ref3=(z1r soften(z10r,z10l) z2);
  664.   p1'=bowl_counter(ref1)--cycle;                                 % counter
  665.   if spur:p1=ref2--ref3--outer_bowlpath(ref1)--cycle;            % bowl and spur
  666.      else:ref0=bowl.l(z5,-ov_b.lc,z1r,h+ov_t.lc,z3r,z3l);        % bowl
  667.           p1=ref2--outer_bowlpath(ref0)--cycle;     fi
  668.   showpoints(1,2,3,5,6,10,11,13,14,20,21);
  669.   adjust(v_c*fitbasis.lc#+m_cc*c_mfit#,v_a*fitbasis.lc#+m_c*c_mfit#); 
  670.   show_character; endchar;
  671.  enddef;
  672.  
  673.  vardef letter_q= save a,b;
  674.   vardef a=condition(spur)t; testing_codes; character_points; enddef;  % spur
  675.   vardef b=condition(spur)f; testing_codes; character_points; enddef;  % no spur
  676.   if test_all_characters:a;b; else:if spur:a; else:b; fi fi
  677.  enddef;
  678.  
  679.  letter_q;  save letter_q;
  680.  
  681.  
  682. iff OK "r":  "The letter r"; 
  683.   beginchar("r",r_w*width#+a_mono#,xheight#,0);
  684.  
  685.   save arch_thickness; arch_thickness.lc=max(1,minor_curve.lc);
  686.   save_num(arch_reference)=.95;
  687.   top lft z11l=(0,h)//;      multpos(11,14)(stem.lc,0);      
  688.   bot lft z14l=(0,0);
  689.   rt z1=(w,if bulb_taper:.99h else:.95h fi)//;
  690.   save_num(knob)=if bulb_taper:stem.lc
  691.     else:inlimit(2bulb_thickness)(1.3arch_thickness.lc,.6(w-x14r))  fi;
  692.   save_num(arm_softness)=.3knob;
  693.   rt z40r=(w,.5h);             pos40(knob,0);
  694.   onaline(11r,14r)(5,13r);  
  695.   y5=(inlimit(ductal)(.1,.3))[h-arch_thickness.lc,serif_thickness];  
  696.   onaline(11l,14l)(12l,13l); y13l=x_bracket_h; y13r=min(y13l,y5);         
  697.                              y12l=max(h-x_bracket_h,y13l);
  698.  
  699.   ref1=terminalserif.l(z11,z14,z12l,z5,.5ts,x_terminal_angle);
  700.   ref2=arch.tr(z5,h+ov_t.lc,z40l,z40r)lc;
  701.   z2r=(point 1 of ref2); 
  702.   z2l=(point 1 of reverse ref2); 
  703.  
  704.   p1=(fullserif(z14,z11,z13l,z13r,.5hs,.75hs)--z5)softjoin
  705.      (z5--subpath(2,1)of reverse ref2--
  706.       bulb.tr(z1,z2l,z2r,knob,knob,90)--
  707.       outer_juncture_path.tl(subpath(1,infinity)of ref2,ref1,1))--cycle;
  708.  
  709.   showpoints(1,2,5,11,12,13,14,40);
  710. adjust(v_a*fitbasis.lc#+m_e*a_mfit#,
  711.        max(v_h*fitbasis.lc#,v_a*fitbasis.lc#-(r_w-i_w)*width#)+m_ee*a_mfit#); 
  712. show_character; endchar;
  713.  
  714.  
  715.  
  716. iff OK "s":  "The letter s";
  717.   beginchar("s",s_w*width#+b_mono#,xheight#,0);
  718.  
  719.   save circ_s; circ_s1=.5(1-circ1); circ_s2=.5(1-circ1);  % lessens tension
  720.   save circ; circ1=1-circ_s1; circ2=1-circ_s2;            %  variance
  721.   save_num(term_length)=if bulb_taper:c_and_s.lc else:.75cs fi;  
  722.   rt z1=(.93w,.95h)//;                 
  723.   lft z7=(0,.07h)//;     
  724.   top y2l=bot y2r+minor_curve.lc=h+ov_t.lc;  
  725.   bot y6r=top y6l-minor_curve.lc=-ov_b.lc;   
  726.   z4=(.5w,.52h)//;
  727.   lft z3l=(round(.05w),.5[y4,y2l])//; 
  728.   rt z5r=(w,.5[y6r,y4])//; 
  729.   good_x_for(2l)(z3l,z1,.5)a;  good_x_for(2r)(z3r,z1-(bulb_thickness,0),.4)b;
  730.   good_x_for(6r)(z7,z5r,.5)c;  good_x_for(6l)(z7+(bulb_thickness,0),z5l,.6)d;
  731.  
  732.   z3=z3l+(.5stem.lc,0); z5=z5r-(.5stem.lc,0); 
  733.   ref1=z3..z4..z5;
  734.   pos4(stem.lc,(angle(postcontrol 1 of ref1-precontrol 1 of ref1))+90-10);
  735.   rt z3r=(lft x3l+max(1,.95stem.lc),(1-v_stress)[y4r,y2r]); 
  736.   lft z5l=(rt x5r-.95stem.lc,v_stress[y6l,y4l]);
  737.  
  738.   p1=bulb.tr(z1,z2r,z2l,term_length,bulb_thickness,90) 
  739.      o_t z3l{downward} o_t z4l i_t z5l i_t 
  740.      bulb.bl(z7,z6l,z6r,1.1term_length,bulb_thickness,90)
  741.      o_t z5r{upward} o_t z4r i_t z3r i_t cycle;
  742.  
  743.  showpoints(1,2,3,4,5,6,7,8);
  744. adjust(v_f*fitbasis.lc#+m_a*b_mfit#,v_f*fitbasis.lc#+m_a*b_mfit#); 
  745. show_character; endchar;
  746.  
  747.  
  748.  
  749. iff OK "t": "The letter t"; 
  750.   beginchar("t",s_w*width#+d_mono#,max(1.2xheight#,.5[xheight#,cap#]),0);
  751.  
  752.   lft z1l=(round .2w,max(h,xheight+1))//; 
  753.   rt z1r=(x1l+stem.lc,y1l+max(1,.3stem.lc));  
  754.   lft z3l=(round .2w,.35*xheight)//; rt z3r=(x3l+stem.lc,.35*xheight);  
  755.   rt z5l=(w,.15xheight)//;           pos5(max(1,.85minor_curve.lc),130-oblique);
  756.   bot y4l=top y4r-minor_curve.lc=-ov_t.lc; 
  757.   good_x_for(4l)(z3l,z5l,.5)c;  good_x_for(4r)(z3r,z5r,.5)d; 
  758.   x4r:=min(x4r,x4l+minor_curve.lc);
  759.  
  760.   top z11=(.9w,xheight)//;  multpos(12,13)(max(1,.8thin_stem.lc),90);
  761.   onaline(1r,3r)(12r);  y12r=y11;
  762.   top lft z13r=(0,xheight)//; 
  763.  
  764.   p1=(z3l{downward} o_t z4l{right} o_t z5l 
  765.         if softpath:)softjoin(z5l--z5r)softjoin(else:--fi 
  766.       z5r i_t z4r{left} i_t z3r{upward} soften(z1r,z1l) z3l{downward})--cycle;
  767.   min_limit(join_radius)(.5*min(.8thin_stem.lc,serif_thickness));
  768.   p2=(arm.tr(z11,z12l,z12r,.15as,.25tip_thickness,90)
  769.       soften(z13r,z13l) z12l)--cycle;
  770.  
  771.  
  772.   showpoints(1,2,3,4,5,11,12,13);
  773. adjust(v_b*fitbasis.lc#-.2s_w*width#+m_e*d_mfit#,v_h*fitbasis.lc#+m_ee*d_mfit#);
  774. show_character; 
  775. endchar;
  776.  
  777.  
  778.  
  779. iff OK "u":  "The letter u";
  780.   beginchar("u",n_w*width#+b_mono#,xheight#,0);  
  781.  
  782.   y5=ductal[arch_thickness.lc,h-serif_thickness];
  783.   
  784.   bot lft z1l=(0,0);          multpos(1,4,11,14)(stem.lc,0);
  785.   top lft z4l=(0,h)//;     
  786.   top rt z11r=(w,h)//;        
  787.   bot rt z14r=(w,0);          y13r=x_bracket_h; y12l=max(h-x_bracket_h,y5);
  788.   onaline(11l,14l)(5,12l);    y12r=max(h-x_bracket_h,y13r);
  789.   onaline(11r,14r)(12r,13r);  y2l=(.95-l_arch)*h; y3l=max(h-x_bracket_h,y2l);
  790.   onaline(1l,4l)(2l,3l);      y2r=max((.95-r_arch)*h,arch_thickness.lc);
  791.   onaline(1r,4r)(2r,3r);      y3r=max(h-x_bracket_h,y2r);
  792.                               
  793.  
  794.   ref1=z12l..terminalserif.r(z14,z11,z12l,z13r,.5ts,base_terminal_angle);
  795.   ref2=arch.bl(z5,-ov_b.lc,z2r,z2l)lc;
  796.  
  797.   p1=terminalserif.l(z11,z14,z12l,z12r,.5ts,0)--softenit(ref1,ref2)--
  798.      terminalserif.l(z4,z1,z3l,z3r,.5ts,x_terminal_angle)--
  799.      outer_juncture_path.br(ref2,ref1,2)--cycle;
  800.  
  801.  showpoints(1,2,3,4,5,11,12,13,14);
  802. adjust(v_b*fitbasis.lc#+m_cc*b_mfit#,v_a*fitbasis.lc#+m_c*b_mfit#); 
  803. show_character; endchar;
  804.  
  805.  
  806.  
  807.  
  808.  def character_points=
  809. iff OK "v":  "The letter v"; 
  810.   beginchar(118+alt4,v_w*width#+d_mono#,xheight#,0);
  811.   save_bool(nonotch):=if(xheight<25):true else:false fi;      % if real low res
  812.   min_limit(join_radius)(.5apex.lc); 
  813.   bot z20=(.5w,-ov_apex.lc); pos20(apex.lc,0-apex_angle);
  814.   lft z1l=(0,h)//;        multpos(1,3)(.95stem.lc,constant_angle(z1l,z20l,0));
  815.   rt z4r=(w,h)//;         multpos(4,6)(thin_stem.lc,constant_angle(z4r,z20r,0));
  816.   onaline(1l,20l)(2l,3l);   y3l=y20l;  
  817.   onaline(1r,3r)(2r,40);     
  818.   onaline(4r,20r)(5r,6r);   y6r=y20r;
  819.   onaline(4l,6l)(5l,40);    y2l=y2r=y5l=y5r=max(h-x_bracket_h,y40);
  820.   onaline(1,3)(41);         top y41=top y42=h; 
  821.   onaline(4,6)(42);  
  822.   ref1=notch_pos[z40,z2r]--z40--notch_pos[z40,z5l];
  823.   if flat_diagonal_endings:
  824.         p1=(fullserif.l(z41,z3,z2l,z2r,.5hs,.5hs) soften(z20l,z20r)
  825.             fullserif.r(z42,z6,z5l,z5r,.5hs,.5hs)..
  826.             downnotch.r(ref1,angle(z20-z40),notch_length.lc))..cycle;
  827.    else:p1=(terminalserif.l(z41,z3,z2l,z2r,.5ts,diag_terminal_angle)soft
  828.             soften(z20l,z20r) terminalserif.l(z42,z6,z5l,z5r,.5ts,0)soft..
  829.             downnotch.r(ref1,angle(z20-z40),notch_length.lc))--cycle;
  830.    fi
  831.   showpoints(1,2,3,4,5,6,20,40,41,42);
  832.   adjust(v_d*fitbasis.lc#+m_a*d_mfit#,v_e*fitbasis.lc#+m_a*d_mfit#); 
  833.   show_character; endchar;
  834.  enddef;
  835.  
  836.  vardef letter_v= save a,b;
  837.   vardef a=condition(flat_diagonal_endings)t; testing_codes; 
  838.            character_points; enddef;
  839.   vardef b=condition(flat_diagonal_endings)f; testing_codes; 
  840.            character_points; enddef;
  841.   if test_all_characters:a;b; else:if flat_diagonal_endings:a; else:b; fi fi
  842.  enddef;
  843.  
  844.  letter_v;  save letter_v;
  845.  
  846.  
  847.  
  848.  def character_points=
  849. iff OK "w":  "The letter w";
  850.   beginchar(119+alt4,w_w*width#+f_mono#,xheight#,0);
  851.   save_bool(nonotch):=if(xheight<25):true else:false fi;      % if real low res
  852.   min_limit(join_radius)(.5apex.lc); 
  853.   lft z1l=(0,h)//; 
  854.   rt z10r=(w,h)//;
  855.   bot z21=(.22w,-ov_apex.lc);   multpos(21,22,23)(apex.lc,0-apex_angle);
  856.   bot z23=(w-x21,-ov_apex.lc);
  857.  
  858.   z3l=z21l; z6r=z21r; z9l=z23l; z12r=z23r;
  859.   multpos(1,3)(if narrow_condition:w_narrow_amt else:1 fi[thin_stem.lc,stem.lc],
  860.                constant_angle(z1l,z21l,0)); 
  861.   multpos(10,12)(thin_stem.lc,constant_angle(z10r,z23r,0));
  862.   onaline(1r,3r)(2r,41,46);    onaline(1l,3l)(2l);    onaline(1,3)(44);  
  863.   onaline(10l,12l)(11l,43,47); onaline(10r,12r)(11r); onaline(10,12)(45);
  864.  
  865.   top y44=h;y45=y46=y47=y44; 
  866.   x22=.5[x46,x47];  y22=if singlepitch:.8h else:h+ov_apex.lc fi;
  867.   z4l=z22l; z7r=z22r;   
  868.   multpos(4,6)(thin_stem.lc,constant_angle(z22l,z21r,thin_stem.lc)lr);     
  869.   multpos(7,9)(if narrow_condition:w_narrow_amt else:1 fi[thin_stem.lc,stem.lc],
  870.                constant_angle(z22r,z23l,stem.lc));       
  871.   onaline(4l,6l)(5l,41);       onaline(4r,6r)(5r,42);
  872.   onaline(7l,9l)(8l,42);       onaline(7r,9r)(8r,43); 
  873.   y5l=y8r=notch_pos[max(y41,y43),y22]; y5r=y8l=notch_pos[y42,y3l]; 
  874.   y2l=y2r=y11l=y11r=max(h-x_bracket_h,y41,y43);  
  875.  
  876.   ref1=notch_pos[z41,z2r]--z41--z5l;
  877.   ref2=z8l--z42--z5r;
  878.   ref3=z8r--z43--notch_pos[z43,z11l];
  879.  
  880.   if flat_diagonal_endings:
  881.     p1=(fullserif.l(z44,z3,z2l,z2r,.5hs,.5hs) soften(z21l,z21r) 
  882.         upnotch.r(ref2,angle(z22-z42),notch_length.lc)
  883.         soften(z23l,z23r) fullserif.r(z45,z12,z11l,z11r,.5hs,.5hs)..
  884.         downnotch.r(ref3,angle(z23-z43),notch_length.lc) soften(z22r,z22l) 
  885.         downnotch.r(ref1,angle(z21-z41),notch_length.lc))..cycle;
  886.     else:p1=(terminalserif.l(z44,z3,z2l,z2r,.75ts,20)soft soften(z21l,z21r) 
  887.         upnotch.r(ref2,angle(z22-z42),notch_length.lc)
  888.         soften(z23l,z23r) terminalserif.l(z45,z12,z11l,z11r,.5ts,0)soft..
  889.         downnotch.r(ref3,angle(z23-z43),notch_length.lc) soften(z22r,z22l) 
  890.         downnotch.r(ref1,angle(z21-z41),notch_length.lc))..cycle;
  891.     fi
  892.   showpoints(1,2,3,4,5,6,7,8,9,10,11,12,21,22,23,41,42,43,44,45,46,47);
  893.   adjust(v_d*fitbasis.lc#+m_a*f_mfit#,v_e*fitbasis.lc#+m_a*f_mfit#);
  894.   show_character;endchar;
  895.  enddef;
  896.  
  897.  vardef letter_w= save a,b;
  898.   vardef a=condition(flat_diagonal_endings)t; testing_codes; 
  899.            character_points; enddef;
  900.   vardef b=condition(flat_diagonal_endings)f; testing_codes; 
  901.            character_points; enddef;
  902.   if test_all_characters:a;b; else:if flat_diagonal_endings:a; else:b; fi fi
  903.  enddef;
  904.  
  905.  letter_w;  save letter_w;
  906.  
  907.  
  908.  
  909.  
  910.  def character_points=
  911. iff OK "x":  "The letter x"; 
  912.   beginchar(120+alt4,v_w*width#+d_mono#,xheight#,0);     
  913.   top z1l=(.05w,h)//; top z11r=(.95w,h)//;
  914.   bot z4r=(w,0);      bot z14l=(0,0); 
  915.   multpos(1,4)(stem.lc,constant_angle(z1l,z4r,stem.lc)lr);        
  916.   multpos(11,14)(thin_stem.lc,constant_angle(z11r,z14l,thin_stem.lc));        
  917.   onaline(1l,4l)(2l,3l,42,43);   
  918.   onaline(1r,4r)(2r,3r,40,41);   
  919.   onaline(1,4)(21,22);             top y21=top y23=h;
  920.   onaline(11l,14l)(12l,13l,40,43); 
  921.   onaline(11r,14r)(12r,13r,41,42); 
  922.   onaline(11,14)(23,24);           bot y22=bot y24=0;
  923.   y2l=y2r=y12l=y12r=max(h-serif_thickness-.5x_bracket_h,y40);
  924.   y3l=y3r=y13l=y13r=min(serif_thickness+.5x_bracket_h,y42);
  925.  
  926.   ref1=notch_pos[z40,z2r]--z40--notch_pos[z40,z12l];
  927.   ref2=notch_pos[z42,z3l]--z42--notch_pos[z42,z13r];
  928.  
  929.   if flat_diagonal_endings:p1=fullserif(z21,z4,z2l,z2r,.5hs,.25hs)--z43--
  930.       fullserif(z24,z11,z13l,z13r,.5hs,.5hs)--
  931.       upnotch.r(ref2,angle(z40-z42),notch_length.lc)--
  932.       fullserif(z22,z1,z3l,z3r,.5hs,.5hs)--z41--
  933.       fullserif(z23,z14,z12l,z12r,.25hs,.5hs)-- 
  934.       downnotch.r(ref1,angle(z42-z40),notch_length.lc)--cycle;
  935.     else:p1=terminalserif.l(z21,z4,z2l,z2r,.5ts,0)soft--z43--
  936.       terminalserif.r(z24,z11,z13l,z13r,.5ts,0)soft--
  937.       upnotch.r(ref2,angle(z40-z42),notch_length.lc)--
  938.       terminalserif.r(z22,z1,z3l,z3r,.5ts,diag_terminal_angle)soft--z41--
  939.       terminalserif.l(z23,z14,z12l,z12r,.5ts,0)soft--
  940.       downnotch.r(ref1,angle(z42-z40),notch_length.lc)--cycle;
  941.     fi
  942.   showpoints(1,2,3,4,11,12,13,14,21,22,23,24,40,41,42,43);
  943.   adjust(v_g*fitbasis.lc#+m_a*d_mfit#,v_g*fitbasis.lc#+m_a*d_mfit#); 
  944.   show_character; endchar;
  945.  enddef;
  946.  
  947.  vardef letter_x= save a,b;
  948.   vardef a=condition(flat_diagonal_endings)t; testing_codes; 
  949.            character_points; enddef;
  950.   vardef b=condition(flat_diagonal_endings)f; testing_codes;
  951.            character_points; enddef;
  952.   if test_all_characters:a;b; else:if flat_diagonal_endings:a; else:b; fi fi
  953.  enddef;
  954.  
  955.  letter_x;  save letter_x;
  956.  
  957.  
  958.  
  959.  
  960.  def character_points= 
  961. iff OK "y":  "The letter y"; 
  962.   beginchar(121+alt4,v_w*width#+d_mono#,xheight#,descender#);
  963.  
  964.   bot z20=(.5w+.5thin_stem.lc,0);
  965.   rt z4r=(w,h)//;          
  966.   multpos(4,7)(thin_stem.lc,constant_angle(z4r,z20,0));
  967.   onaline(4r,20)(5r,6r,7r);     y7=-d; y6r=y7+x_bracket_h;  
  968.   onaline(4l,7l)(3l,5l,6l,40);  y3l=.05h;
  969.   lft z1l=(0,h)//;    
  970.   multpos(1,3)(stem.lc,constant_angle(z1l,z3l,0));
  971.   onaline(1l,3l)(2l);     
  972.   onaline(1r,3r)(2r,40);        y2l=y2r=y5l=y5r=max(h-x_bracket_h,y40);
  973.   onaline(1,3)(41);             top y41=top y42=h; y6l=min(y6r,y3l); 
  974.   onaline(4,7)(42);  
  975.   ref1=notch_pos[z40,z2r]--z40--notch_pos[z40,z5l];
  976.  
  977.   if flat_diagonal_endings:p1=(fullserif.l(z41,z3,z2l,z2r,.5hs,.5hs)--z3l
  978.          if softpath:)softjoin( else:-- fi z3l--
  979.        fullserif(z7,z4,z6l,z6r,.75hs,.5hs)..
  980.        fullserif(z42,z7,z5l,z5r,.5hs,.5hs)..
  981.        downnotch.r(ref1,angle(z20-z40),notch_length.lc))..cycle;
  982.     else:p1=(terminalserif.l(z41,z3,z2l,z2r,.5ts,diag_terminal_angle)soft
  983.         ..z3l if softpath:)softjoin( else:-- fi z3l--
  984.        terminalserif.l(z7,z4,z6l,z6r,.5ts,0)soft..
  985.        terminalserif.l(z42,z7,z5l,z5r,.5ts,0)soft..
  986.        downnotch.r(ref1,angle(z20-z40),notch_length.lc))..cycle;
  987.     fi
  988.   showpoints(1,2,3,4,5,6,7,20,40,41,42);
  989.   adjust(v_d*fitbasis.lc#+m_a*d_mfit#,v_e*fitbasis.lc#+m_a*d_mfit#); 
  990.   show_character; endchar;
  991.  enddef;
  992.  
  993.  vardef letter_y= save a,b;
  994.   vardef a=condition(flat_diagonal_endings)t; testing_codes; 
  995.            character_points; enddef;
  996.   vardef b=condition(flat_diagonal_endings)f; testing_codes; 
  997.            character_points; enddef;
  998.   if test_all_characters:a;b; else:if flat_diagonal_endings:a; else:b; fi fi
  999.  enddef;
  1000.  
  1001.  letter_y;  save letter_y;
  1002.  
  1003.  
  1004.  
  1005. iff OK "z":  "The letter z"; 
  1006.   beginchar("z",s_w*width#+b_mono#,xheight#,0);
  1007.  
  1008.   min_limit(join_radius)(.5apex.lc); 
  1009.   top rt z1r=(w,h-apex.lc)//; 
  1010.   bot lft z3l=(0,apex.lc);  
  1011.   multpos(1,3)(max(1,.98stem.lc),constant_angle(z1r,z3l,max(1,.98stem.lc)));  
  1012.  
  1013.   z43=(x1r,h);
  1014.   z41=(x3l,0);
  1015.   rt z14=(w,0); 
  1016.   lft z11=(.05w,h)//;
  1017.   top y12r=h; bot y12l=bot y40=top y12r-max(1,.95thin_stem.lc);
  1018.   bot y13l=0; top y13r=top y42=bot y13l+max(1,.95thin_stem.lc);
  1019.   onaline(1l,3l)(2l,40);  y2l=notch_pos[y40,y3l];
  1020.   onaline(1r,3r)(2r,42);  y2r=notch_pos[y42,y1r];  
  1021.   good_x_for(12r)(z11,z43,.5)a;good_x_for(12l)(z11+(tip_thickness,0),z40,.5)b;
  1022.   good_x_for(13l)(z41,z14,.5)c;good_x_for(13r)(z42,z14-(tip_thickness,0),.5)d;
  1023.  
  1024.   ref1=z2l--z40--z12l; ref2=z2r--z42--z13r;
  1025.  
  1026.   p1=(arm.tl(z11,z12l,z12r,.4as,tip_thickness,90)soft--
  1027.       rightnotch.r(ref1,angle right,notch_length.lc)etchdown
  1028.       soften(z2l,z3l,z41,z13l)
  1029.       arm.br(z14,z13r,z13l,.5as,tip_thickness,90-arm_angle)soft--
  1030.       leftnotch.r(ref2,angle left,notch_length.lc)etchup
  1031.       soften(z2r,z1r,z43) z12r)--cycle;
  1032.  
  1033.   showpoints(1,2,3,11,12,13,40,41,42);
  1034. adjust(v_g*fitbasis.lc#+m_a*b_mfit#,v_g*fitbasis.lc#+m_a*b_mfit#); 
  1035. show_character; endchar; 
  1036.  
  1037.